繼續探討我們昨天沒完成的 ARM Instruction Sets。
不同CPU在溝通時,可能會因為Byte Ordering (Big Endian 或 Little Endian不同),而需要Reverse 操作。
REV Rd, Rn ; Rd = rev(Rn) ;Reverse bytes in word
REV16 Rd, Rn ; Rd = rev16(Rn) ;Reverse bytes in each half word
REVSH Rd, Rn ; Rd = revsh(Rn) ;Reverse bytes in bottom half word and sign extend the result
前面介紹的 Register movement operations 的 MOV 指令只有在 Register 之間互相傳送資料,這次補充 Register 和
memory 間互相傳遞資料。
LDR r0, [r1] ; r0 <-- mem[r1]
STR r1, [r0] ; mem[r0] <-- r1
LDR.W R0,[R1, #offset]! ; Read mem[R1+offset], with R1
; update to R1+offset
使用.W Postindexing 更新 Register
驚嘆號(!)代表要存取後會 register 進行更新
IA,IB,DA,DB 遞增/遞減()記憶體中的地址以Load/sotre你的數據,還有 after/before之分必須注意可能會導致記憶體位置有所不同
STM r0, {r1,r2} ; r1 --> [r0] r2 --> [r0+4]
STM r0, {r1,r2} ; r1 <-- [r0] r2 <-- [r0+4]
higher register numbers in higher addresses
與 Single load/store 相反
MSR r0, IPSR ;(r0 <-- IPSR)
MSR APSR, r0 ;(APSR <-- r0)
用來實作Program Control
Conditional Branch Instructions
r13 是 SP (stack pointer)
除了 PUSH、POP 我們也可以使用 STM/LDM 搭配 FA,FD,EA,ED來進行操作。
Full 代表最後被使用的地址。
Thumb Instruction Sets 可以看做是 ARM Instruction Sets 壓縮子集,能夠提供程式碼更佳的密度,它是16-bit的指令模式,缺點就是會受到一些限制。後來又有 Thumb2 的出現,原本單純的 16 bits Thumb 指令集加入了一些 32 bits 的指令, 也加入了 IT (If Then) 指令。
所有Cortex-M CPU都使用Thumb-2指令集
ARM指令
ARM Instruction Set
Definitive Guide To the ARM Cortex-M3
NYCU OCW Lec05 微處理機系統實驗
Introduction to Computer Systems